package com.agile.leetcode.jdk8.optional;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @Author ChenZhangKun
 * @Date 2020/12/24 9:06
 */
public class OptionalDemo {
    public static void main(String[] args) {
        // of 该方法会返回一个不会null的optional对象，如果value为null的话则会抛出NullPointerException 异常。
        Optional<String> czk = Optional.of("czk");
        // get,拿到包裹的值
        System.out.println(czk.get());
        // 空指针，抛异常
        // Optional<Object> o = Optional.of(null);
        // ofNullable 当value不为null时会返回一个optional对象，如果value为null的时候，则会返回一个空的optional对象。
        Optional<String> czk1 = Optional.ofNullable("czk");
        System.out.println(czk1.get());
        // 不会抛出异常
        Optional<Object> o = Optional.ofNullable(null);
        // isPresent 有数值则返回true,空的则返回false
        if (!o.isPresent()){
            System.out.println(o+"为空对象");
        }
        // ifPresent 如果Optional实例有值则为其调用consumer，否则不做处理
        Optional.of("name").ifPresent(x-> System.out.println("consumer消费了"+x));
        // orElse 如果value不为null的话直接返回value，否则返回传入的other值。
        // 输出czk
        System.out.println(Optional.ofNullable(null).orElse("czk"));
        // orElseGet 与orElse方法类似，区别在于得到的默认值。orElse方法将传入的字符串作为默认值，orElseGet方法可以接受Supplier接口的实现用来生成默认值
        System.out.println(Optional.ofNullable(null).orElseGet(() -> "nzq"));
        // map 则对其执行调用mapping函数得到返回值。如果返回值不为null，则创建包含mapping返回值的Optional作为map方法返回值，否则返回空Optional。
        System.out.println(Optional.ofNullable("kd").map(x -> x.toUpperCase()).get());
        // flatMap 如果有值，为其执行mapping函数返回Optional类型返回值，否则返回空Optional。
        System.out.println(Optional.ofNullable("JAMES").flatMap(x -> Optional.of(x.toLowerCase())).get());
        // filter 如果有值并且满足断言条件返回包含该值的Optional，否则返回空Optional。
        List<String> list = Arrays.asList("czk", "czj");
        for (String s : list) {
            Optional<String> czj = Optional.ofNullable(s).filter(x -> Objects.equals(x, "czj"));
            if (czj.isPresent()){
                System.out.println(czj.get());
            }
        }
    }
}
